/**
 * * 设置Cookie过期时间，并返回给前端
 * @param { Context } ctx *
 */
const awaitNext = (ctx) => {
  if (ctx.body && ctx.body.code === 200) {
    ctx.body.Cookie = ctx.state.Cookie
    ctx.body.CookieExp = new Date().getTime() + 1000 * 60 * 15 // 比当前时间多15分钟
  }
}

/**
 * * 因为在所有的教务系统相关请求中都涉及到账号密码检测，因此在相关请求前，先统一经过Cookie检测
 * * 当出现 “账号或密码错误”、“教务系统请求异常”等情况直接响应异常信息，不在继续进行路由匹配
 * * 当正常登入时，将已激活的Cookie值存储在ctx.state中，继续向下执行
 * @return {() => Promise} *
 */
module.exports = () => async (ctx, next) => {
  const { Cookie } = ctx.data
  const { useOldCookie } = ctx.state

  if ((useOldCookie && !Cookie) || ctx.url === '/login') { // 前端未传递Cookie或请求登录接口时执行登录，获取cookie
    const { setCookie, status } = await ctx.service.login.getCookie()

    // 状态码为302时表示账号密码正确
    if (status === 302) {
      ctx.state.Cookie = setCookie
      await next() // 执行后续中间件
      awaitNext(ctx)
    }

    // 状态码为200时表示用户名或密码错误（目前只发现这一种情况）
    else if (status === 200) {
      ctx.body = {
        code: 401,
        msg: '用户名或密码错误',
      }
    }

    // 状态码为404时表示教务系统无法访问
    else if (status === 404) {
      ctx.body = {
        code: 500,
        msg: '系统服务器异常，请稍后再试',
      }
    }

    // 其它情况的状态码统一提示异常
    else {
      ctx.body = {
        code: 500,
        msg: '系统服务器异常，请稍后再试',
      }
    }
  } else {
    ctx.state.Cookie = Cookie
    await next()
    awaitNext(ctx)
  }
}
